import axios, { type Method } from 'axios'
import router from '@/router'
import { useUserStore } from '@/stores'
import { showToast } from 'vant'
import type { TRes } from '@/types/data'
// 定义基地址
const baseURL = 'https://consult-api.itheima.net/'

// 创建 axios 实例
const services = axios.create({
    // 传入基地址
    baseURL,
    // 超时时间为10s
    timeout: 10000
})

// 注册请求拦截器
services.interceptors.request.use((config: any) => {
    // 获取 user 模块的实例
    const store = useUserStore()
    // 如果用户已登录，则将 token 添加到请求头中
    if (store.user?.token && config.headers) {
        config.headers['Authorization'] = `Bearer ${store.user?.token}`
    }
    return config
}, error => {
    return Promise.reject(error)
})

// 注册响应拦截器
services.interceptors.response.use(res => {
    // 当 http 状态码是2xx时，会进入该回调，但 http 状态码正常，不代表业务也正常
    if (res.data.code !== 10000) {
        showToast(res.data.message || '网络异常')
        return Promise.reject(res.data)
    }
    // 正常返回响应体数据
    return res.data
}, err => {
    // token 过期了
    if (err.response.status === 401) {
        // 清除token
        const store = useUserStore()
        store.deleteUser()
        // 跳转至登录页，并传递重定向页面的参数
        router.push(`/login?redirect=${router.currentRoute.value.fullPath}`)
    }
    // 当http状态码为4xx、5xx时，会进入这个回调
    return Promise.reject(err)
})

// 封装请求工具方法
/* const request = <T>(
    url: string,
    method: Method = 'GET',
    submitData?: object
) => {
    // 参数1： 泛型，但这个类型会赋值给 res.data
    // 参数2： 服务器返回数据的类型，这个数据会直接赋值给 res
    return services.request<T, AirRes<T>>({
        url,
        method,
        [method.toLocaleLowerCase() === 'get' ? 'params' : 'data']: submitData
    })
} */
const request = <T>(url: string, method: Method = 'get', data?: object) =>
  services.request<T, TRes<T>>({
    url,
    method,
    [method.toLocaleLowerCase() === 'get' ? 'params' : 'data']: data
})

export { baseURL, request }